#ifndef _RANGE_H_
#define _RANGE_H_

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Namespaces
////////////////////////////////////////////////////////////////////////////////

namespace Types {

////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////

/**
 *  Generic Range class.
 *	This class creates a generic Range.
 */
template <typename T>
class Range {

	public:

		/// Range creation with default values
		Range() {}

		/// Range creation with initialisation values
		Range(const T & begin, const T & end) : begin(begin), end(end) {}

		/// Create a copy of the given instance
		template <typename T2>
		Range(const Range<T2> & inst)
		: begin(static_cast<T>(inst.GetBegin())), end(static_cast<T>(inst.GetEnd())) {}
		
		/// Affectation operator
		template <typename T2>
		Range<T> & operator = (const Range<T2> & inst) {
			if (this != &inst) {
				this->begin	= static_cast<T>(inst.GetBegin());
				this->end = static_cast<T>(inst.GetEnd());	
			}
			return *this;
		}
		
		/// Returns the begin value
		T & Begin() { return this->begin; }
		const T & GetBegin() const { return this->begin; }
		
		/// Returns the end value
		T & End() { return this->end; }
		const T & GetEnd() const { return this->end; }
		
	protected:
		
		/// Begin value
		T begin;
		
		/// End value
		T end;

};

////////////////////////////////////////////////////////////////////////////////
// Closing Namespaces
////////////////////////////////////////////////////////////////////////////////

}

////////////////////////////////////////////////////////////////////////////////

#endif
